#ifndef __BOARD_COM_H
#define __BOARD_COM_H
#include "can_common.h"
#include "rttypes.h"
#ifdef __cplusplus
extern "C"{
#endif

#include <rtthread.h>
#include <rtdevice.h>

#define CAN_COMM_HEADER 0XA1      // 帧头
#define CAN_COMM_TAIL 0X1A        // 帧尾
#define CAN_COMM_OFFSET_BYTES 4  // 帧头+ datalen + 帧尾 + crc8

#define BOARD_SMALL_YAW_1_ID 0X310
#define BOARD_SMALL_YAW_2_ID 0X311
#define BOARD_BIG_YAW_ID 0X312
#define BOARD_CHASSIS_ID 0X313


#define SENTRY_BOARD_SMALL_YAW_1 1
#define SENTRY_BOARD_SMALL_YAW_2 2
#define SENTRY_BOARD_BIG_YAW 3
#define SENTRY_BOARD_CHASSIS 4

void board_recv(struct rt_can_msg rxmsg);
void board_send(rt_uint8_t *data);
void *CANCommGet();

#pragma pack(1)
/* CAN comm 结构体, 拥有CAN comm的app应该包含一个CAN comm指针 */
typedef struct
{
    /* 发送部分 */
    uint8_t send_data_len; // 发送数据长度
    uint8_t send_buf_len;  // 发送缓冲区长度,为发送数据长度+帧头单包数据长度帧尾以及校验和(4)
    uint8_t raw_sendbuf[60 + CAN_COMM_OFFSET_BYTES]; // 额外4个bytes保存帧头帧尾和校验和
    /* 接收部分 */
    uint8_t recv_data_len; // 接收数据长度
    uint8_t recv_buf_len;  // 接收缓冲区长度,为接收数据长度+帧头单包数据长度帧尾以及校验和(4)
    uint8_t raw_recvbuf[60 + CAN_COMM_OFFSET_BYTES]; // 额外4个bytes保存帧头帧尾和校验和
    uint8_t unpacked_recv_data[128];                  // 解包后的数据,调用CANCommGet()后cast成对应的类型通过指针读取即可
    /* 接收和更新标志位*/
    uint8_t recv_state;   // 接收状态,
    uint8_t cur_recv_len; // 当前已经接收到的数据长度(包括帧头帧尾datalen和校验和)
    uint8_t update_flag;  // 数据更新标志位,当接收到新数据时,会将此标志位置1,调用CANCommGet()后会将此标志位置0

    CanMessage board_tx;
} board_com_s;

extern board_com_s board_com;

#pragma pack()

#ifdef __cplusplus
}
#endif

#endif // CAN_COMMON_H